home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
LOGIC Apps
/
Logic-APPLE_II_APPS.iso
/
mac
/
LOGIC Apple II 5.25" Library - ProDOS
/
PRO009.dsk
/
MISC
/
BYTE.ZAP.bas
< prev
next >
Wrap
BASIC Source File
|
2012-02-16
|
11KB
|
311 lines
100 REM BZAP
110 REM EDITS PRODOS DISK BLOCKS
120 DIM B2(50)
130 D$ = CHR$(4)
140 X$ = "0123456789ABCDEF"
150 MO$ = "???JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC"
160 BF = 30000: REM START OF BUFFER AREA
170 START = 20480:EN = 20552
180 FOR PLACE = START TO EN
190 READ CODE
200 POKE PLACE,CODE
210 NEXT PLACE
220 DATA 76,10,80,3,96,0,16,0,0,128
230 DATA 173,9,80,141,19,80,32,0,191,0
240 DATA 3,80,144,25,72,169,135,32,237,253
250 DATA 169,210,32,237,253,169,195,32,237,253
260 DATA 169,189,32,237,253,104,76,218,253,24
270 DATA 173,5,80,133,60,105,175,133,62,173
280 DATA 6,80,133,61,105,0,133,63,76,179
290 DATA 253,0,0
300 INPUT "READ WHICH BLOCK INTO MEMORY? ";BN
310 X = FRE(0)
320 BH = INT(BN/256):BL = BN -(BH *256)
330 POKE ST +7,BL: POKE ST +8,BH
340 POKE ST +9,128: REM READ BLK
350 INPUT "WHICH DISK DRIVE? ";DV
360 REM SELECT INPUT DEVICE
370 IF DV = 1 THEN POKE ST +4,96
380 IF DV = 2 THEN POKE ST +4,224
390 INPUT "PRINT IT? (Y OR N): ";P1$
400 IF P1$ = "N" OR P1$ = "n" THEN GOTO 430
410 PRINT D$;"PR#1"
420 PRINT : PRINT "BLOCK ";BN: PRINT
430 POKE ST +5,0: POKE ST +6,128: REM BUFFER
440 CALL 20480
450 PRINT : PRINT
460 IF PEEK(49183) >127 THEN PRINT CHR$(4);"PR#3": GOTO 480
470 PRINT D$;"PR#0"
480 IF OP = 3 THEN 520
490 CD = 0:CS = 0: REM RESET CONTINUATION FLAGS
500 PRINT
510 PRINT "BLOCK ";BN;" WAS READ INTO MEMORY AT $8000"
520 PRINT
530 PRINT "YOUR CHOICES:"
540 PRINT
550 PRINT " 1 = SHOW AS ASCII"
560 PRINT
570 PRINT " 2 = CHANGE MEMORY"
580 PRINT
590 PRINT " 3 = WRITE TO DISK"
600 PRINT
610 PRINT " 4 = READ ANOTHER BLOCK"
620 PRINT
630 PRINT " 5 = QUIT"
640 PRINT
650 PRINT " 6 = DIRECTORY FORMAT"
660 PRINT
670 PRINT " 7 = SUBDIRECTORY FORMAT"
680 PRINT
690 INPUT "ENTER THE NUMBER: ";OP
700 ON OP GOTO 720,1250,1400,300,1460,1840,1660
710 GOTO 690
720 PRINT
730 INPUT "PRINT IT? (Y OR N): ";P2$
740 IF P2$ = "N" OR P2$ = "n" THEN GOTO 760
750 PRINT D$;"PR#1"
760 PRINT "BLOCK ";BN;":"
770 FOR BY = 32768 TO 33280 STEP 8
780 A1 = PEEK(BY)
790 A2 = PEEK(BY +1)
800 A3 = PEEK(BY +2)
810 A4 = PEEK(BY +3)
820 A5 = PEEK(BY +4)
830 A6 = PEEK(BY +5)
840 A7 = PEEK(BY +6)
850 A8 = PEEK(BY +7)
860 PRINT BY;": ";A1;" ";A2;" ";A3;" ";A4;" ";A5;" ";A6;" ";A7;" ";A8
870 PRINT "$";:D = BY: GOSUB 1580: PRINT H$;": ";
880 D = A1:D1 = D: GOSUB 1580: PRINT H$;" ";: GOSUB 1070
890 D = A2:D1 = D: GOSUB 1580: PRINT H$;" ";: GOSUB 1070
900 D = A3:D1 = D: GOSUB 1580: PRINT H$;" ";: GOSUB 1070
910 D = A4:D1 = D: GOSUB 1580: PRINT H$;" ";: GOSUB 1070
920 D = A5:D1 = D: GOSUB 1580: PRINT H$;" ";: GOSUB 1070
930 D = A6:D1 = D: GOSUB 1580: PRINT H$;" ";: GOSUB 1070
940 D = A7:D1 = D: GOSUB 1580: PRINT H$;" ";: GOSUB 1070
950 D = A8: GOSUB 1580: PRINT H$
960 PRINT "ASCII: ";
970 A9 = A1: GOSUB 1100
980 A9 = A2: GOSUB 1100
990 A9 = A3: GOSUB 1100
1000 A9 = A4: GOSUB 1100
1010 A9 = A5: GOSUB 1100
1020 A9 = A6: GOSUB 1100
1030 A9 = A7: GOSUB 1100
1040 A9 = A8: GOSUB 1100
1050 PRINT
1060 GOTO 1180
1070 IF D1 >9 AND D1 <16 THEN PRINT " ";
1080 IF D1 >99 THEN PRINT " ";
1090 RETURN
1100 REM
1110 IF A9 <32 THEN PRINT "-";: GOTO 1140
1120 IF (A9 >127) AND (A9 <160) THEN PRINT "-";: GOTO 1140
1130 PRINT CHR$(A9);
1140 PRINT " ";
1150 IF A9 >9 THEN PRINT " ";
1160 IF A9 >99 THEN PRINT " ";
1170 RETURN
1180 PRINT
1190 REM X
1200 NEXT BY
1210 PRINT
1220 IF PEEK(49183) >127 THEN PRINT CHR$(4);"PR#3": GOTO 500
1230 PRINT D$;"PR#0"
1240 GOTO 500
1250 PRINT
1260 INPUT "CHANGE A RANGE OF ADDRESSES? (Y OR N): ";I$
1270 IF I$ = "N" OR I$ = "n" THEN 1350
1280 INPUT "START ADDRESS (DECIMAL): ";ST
1290 INPUT "END ADDRESS:";EN
1300 FOR AD = ST TO EN
1310 PRINT " CURRENT CONTENTS OF ADDRESS ";AD;" = "; PEEK(AD);: INPUT "NEW CONTENTS: ";NC
1320 POKE AD,NC
1330 NEXT AD
1340 GOTO 520
1350 INPUT "DECIMAL ADDRESS: ";AD
1360 PRINT "CONTAINS: "; PEEK(AD)
1370 INPUT "NEW CONTENTS: ";NC
1380 POKE AD,NC
1390 GOTO 520
1400 POKE ST +9,129: REM WRITE BLK
1410 PRINT "BLOCK #";BN;" WAS READ INTO MEMORY"
1420 INPUT "WRITE MEMORY TO BLOCK #: ";BN
1430 BH = INT(BN/256):BL = BN -(BH *256)
1440 POKE 12295,BL: POKE 12296,BH
1450 GOTO 350
1460 END
1470 REM HEX TO DEC
1480 REM ENTER WITH HEX # AS H$
1490 D = 0: FOR C = 1 TO LEN(H$)
1500 A$ = MID$ (H$,C,1)
1510 IF A$ > = "0" AND A$ < = "9" THEN V = VAL(A$): GOTO 1530
1520 V = ASC(A$) -55
1530 D = D *16 +V
1540 NEXT C
1550 REM DECIMAL OUTPUT IS D
1560 RETURN
1570 REM DEC TO HEX
1580 REM ENTER WITH DEC # AS D
1590 H$ = ""
1600 Q = INT(D/16)
1610 R = D -Q *16
1620 H$ = MID$ (X$,R +1,1) +H$
1630 IF Q THEN D = Q: GOTO 1600
1640 REM HEX OUTPUT IS H$
1650 RETURN
1660 REM SUBDIRECTORY FORMAT
1670 GOSUB 1890
1680 IF H1$ < >"E" THEN CS = 1: REM NOT SUBDIR HEADER
1690 IF CS = 1 THEN FL = 39:EB = 13:NF = 20: PRINT "CONTINUATION OF SUBDIRECTORY": GOTO 2310
1700 IF LEN(H$) = 2 THEN H2$ = RIGHT$(H$,1): PRINT "NAME LENGTH: ";H2$
1710 PRINT "SUBDIRECTORY NAME: ";
1720 NL = 15
1730 H$ = H2$: GOSUB 1470
1740 IF D <15 THEN NL = D
1750 FOR NB = 1 TO NL
1760 PRINT CHR$( PEEK(BY +4 +NB));
1770 NEXT NB
1780 PRINT
1790 GOSUB 2160
1800 PRINT "KEY BLOCK OF PARENT DIRECTORY: "; PEEK(BY +39) + PEEK(BY +40) *256
1810 PRINT "ENTRY NUMBER WITHIN PARENT DIR.: "; PEEK(BY +41)
1820 PRINT "LENGTH OF ENTRIES IN PARENT DIR.: "; PEEK(BY +42)
1830 GOTO 2310
1840 REM DIR FORMAT
1850 REM DIRECTORY HEADER
1860 GOSUB 1890
1870 GOSUB 2050
1880 GOTO 2290
1890 INPUT "PRINT IT? (Y OR N): ";P$
1900 IF P$ < >"Y" THEN GOTO 1920
1910 PRINT CHR$(4);"PR#1"
1920 PRINT : PRINT "BLOCK ";BN: PRINT
1930 BY = 32768: REM START OF BUFFER
1940 FOR B1 = 0 TO 43
1950 B2(B1) = BY +B1
1960 NEXT B1
1970 PRINT "CONTINUED FROM BLOCK "; PEEK(B2(0)) +( PEEK(B2(1)) *256)
1980 PRINT "CONTINUED AT BLOCK "; PEEK(B2(2)) + PEEK(B2(3)) *256
1990 D = PEEK(B2(4)): GOSUB 1580
2000 H1$ = H$
2010 IF LEN(H$) = 2 THEN H1$ = LEFT$(H$,1)
2020 GOSUB 2930: REM GET STORAGE TYPE
2030 PRINT "STORAGE TYPE: ";ST$
2040 RETURN
2050 IF H1$ < >"F" THEN CD = 1: REM NOT DIR HEADER
2060 IF CD = 1 THEN FL = 39:EB = 13:NF = 20: PRINT "CONTINUATION OF DIRECTORY": GOTO 2310
2070 IF LEN(H$) = 2 THEN H2$ = RIGHT$(H$,1): PRINT "NAME LENGTH: ";H2$
2080 PRINT "VOLUME NAME: ";
2090 NL = 15
2100 H$ = H2$: GOSUB 1470
2110 IF D <15 THEN NL = D
2120 FOR NB = 1 TO NL
2130 PRINT CHR$( PEEK(BY +4 +NB));
2140 NEXT NB
2150 PRINT
2160 B2 = BY:B5 = 28: REM DATE BYTE
2170 GOSUB 3010: REM GET DATE
2180 PRINT "CREATION DATE: "DT$;" ";TI$
2190 PRINT "PRODOS VERSION: "; PEEK(BY +32)
2200 PRINT "MINIMUM VERSION: "; PEEK(BY +33)
2210 PRINT "ACCESS: "; PEEK(BY +34)
2220 FL = PEEK(BY +35)
2230 PRINT "LENGTH OF FILE ENTRIES: ";FL
2240 EB = PEEK(BY +36)
2250 PRINT "ENTRIES PER BLOCK OF DIR: ";EB
2260 NF = PEEK(BY +37) + PEEK(BY +38) *256
2270 PRINT "FILES IN DIRECTORY: ";NF
2280 RETURN
2290 PRINT "LOCATION OF VOL BITMAP: "; PEEK(BY +39) + PEEK(BY +40) *256
2300 PRINT "TOTAL BLOCKS IN VOL: "; PEEK(BY +41) + PEEK(BY +42) *256
2310 PRINT
2320 REM SHOW FILE DATA
2330 FOR FILE = 1 TO NF
2340 H$ = "":H1$ = "":H2$ = ""
2350 REM FILL ARRAY FOR FILE
2360 FOR B1 = 0 TO FL
2370 B2(B1) = PEEK(BY +B1)
2380 NEXT B1
2390 REM START AT 1ST FILE
2400 PRINT "FILE ENTRY ";FILE
2410 B2 = 32810 +((FILE -1) *FL) +1
2420 IF CD THEN B2 = BY +4 +((FILE -1) *FL)
2430 REM MAKE BYTE 0 INTO 2 CHAR STRING
2440 D = PEEK(B2): GOSUB 1580: REM GET HEX H$
2450 IF LEN(H$) = 1 THEN H$ = "0" +H$
2460 IF LEN(H$) >2 THEN H$ = RIGHT$(H$,2): GOTO 2450
2470 H1$ = LEFT$(H$,1)
2480 ST$ = H1$: GOSUB 2920
2490 PRINT "STORAGE TYPE: ";ST$
2500 H2$ = RIGHT$(H$,1)
2510 H$ = H2$: GOSUB 1470: REM GET DECIMAL
2520 PRINT "NAME LENGTH: ";D
2530 PRINT "FILE NAME: ",
2540 NL = 15
2550 IF D <15 THEN NL = D
2560 IF D = 0 THEN NL = 15
2570 FOR NB = 1 TO NL
2580 PRINT CHR$( PEEK(B2 +NB));
2590 NEXT NB
2600 PRINT
2610 PRINT "FILE TYPE: ";
2620 D = PEEK(B2 +16): GOSUB 1580
2630 IF H$ = "4" THEN H$ = "TEXT"
2640 IF H$ = "6" THEN H$ = "BINARY"
2650 IF H$ = "F" THEN H$ = "DIRECTORY"
2660 IF H$ = "19" THEN H$ = "APPLEWORKS DATABASE"
2670 IF H$ = "1A" THEN H$ = "APPLEWORKS WP FILE"
2680 IF H$ = "1B" THEN H$ = "APPLEWORKS SPREADSHEET"
2690 IF H$ = "EF" THEN H$ = "PASCAL FILE"
2700 IF H$ = "F0" THEN H$ = "COMMAND FILE"
2710 IF H$ = "FC" THEN H$ = "APPLESOFT BASIC"
2720 IF H$ = "FD" THEN H$ = "VARIABLE FILE"
2730 IF H$ = "FE" THEN H$ = "RELOCATABLE CODE FILE"
2740 IF H$ = "FF" THEN H$ = "SYSTEM FILE"
2750 PRINT H$
2760 PRINT "LOCATION OF KEY BLOCK: "; PEEK(B2 +17) + PEEK(B2 +18) *256
2770 PRINT "BLOCKS USED: "; PEEK(B2 +19) + PEEK(B2 +20) *256
2780 PRINT "LENGTH OF FILE: "; PEEK(B2 +21) + PEEK(B2 +22) *256 + PEEK(B2 +23) *65536
2790 B5 = 24: GOSUB 3010: REM DATE
2800 PRINT "CREATION DATE: ";DT$;" ";TI$
2810 PRINT "PRODOS VERSION: "; PEEK(B2 +28)
2820 PRINT "MINIMUM VERSION: "; PEEK(B2 +29)
2830 PRINT "ACCESS: "; PEEK(B2 +30)
2840 PRINT "AUX. TYPE: "; PEEK(B2 +31) + PEEK(B2 +32) *256
2850 B5 = 33: GOSUB 3010
2860 PRINT "DATE MODIFIED: ";DT$;" ";TI$
2870 PRINT "DIRECTORY BLOCK: "; PEEK(B2 +37) + PEEK(B2 +38) *256
2880 PRINT
2890 IF FILE = (EB -1) THEN FILE = NF
2900 NEXT FILE
2905 FOR TM = 1 TO 2000: NEXT TM
2910 GOTO 450
2920 REM STORAGE TYPE
2930 IF H1$ = "0" THEN ST$ = "DELETED"
2940 IF H1$ = "1" THEN ST$ = "SEEDLING"
2950 IF H1$ = "2" THEN ST$ = "SAPLING"
2960 IF H1$ = "3" THEN ST$ = "TREE"
2970 IF H1$ = "D" THEN ST$ = "SUBDIRECTORY"
2980 IF H1$ = "E" THEN ST$ = "SUBDIRECTORY HEADER"
2990 IF H1$ = "F" THEN ST$ = "DIRECTORY HEADER"
3000 RETURN
3010 REM DATES
3020 DD = PEEK(B2 +B5) - INT( PEEK(B2 +B5)/32) *32
3030 YY = INT( PEEK(B2 +B5 +1)/2)
3040 MM = ( PEEK(B2 +B5 +1) -YY *2) *8 + INT( PEEK(B2 +B5)/32)
3050 MM$ = MID$ (MO$,MM *3 +1,3)
3060 REM READ SYSTEM TIME
3070 MI = PEEK(B2 +B5 +2)
3080 HH = PEEK(B2 +B5 +3)
3090 REM CONVERT 24 HR TO 12
3100 IF HH >11 THEN PM = 1
3110 IF HH >12 THEN HH = HH -12
3120 IF HH = 0 THEN HH = 12
3130 IF DD = 0 THEN DT$ = "(NO DATE)":TIME$ = "(NO TIME)": GOTO 3190
3140 DT$ = RIGHT$("00" + STR$(DD),2) +"-" +MM$ +"-" + RIGHT$("00" + STR$(YY),2)
3150 TIME$ = RIGHT$("00" + STR$(HH),2) +":" + RIGHT$("00" + STR$(MI),2)
3160 IF PM = 1 THEN TIME$ = TIME$ +" PM"
3170 IF PM = 0 THEN TIME$ = TIME$ +" AM"
3180 REM OUTPUT DT$, TI$
3190 RETURN